package naughtydog.threads.concurrency;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

//Usando un generatore per interi e uno per long, con l'uso di sleep non riesco a vedere "accessi concorrenti" (nessuna eccezione).
//Quindi provo a generare un po' di simpatico casino per vedere se si riesce a vedere qualcosa..

//con 500 generatori di interi e 500 generatori di long, ho finalmente trovato un'eccezione (prima o poi arriva sempre..)
public class ThreadsTest03 {
	
	public static void main(String[] args) {
		
		Thread[] intsGenerators = new Thread[1000];
		Thread[] longGenerators = new Thread[1000];
		IModel theModel = new TheModel();
		Timer testTimer = new Timer();	//Timer che "legge" dal modello a frequenza fissata (SERVE SOLO PER TEST, non ha nessun altro senso)
				
		initArrays(intsGenerators, longGenerators, theModel);
		testTimer.scheduleAtFixedRate(new TimerTask() {
			public void run() {
				ArrayList<Integer> integers = (ArrayList<Integer>)theModel.getInts();
				for (Integer aInt : integers) {		
					System.out.println(aInt);										
				}
				System.out.println("The long: " + theModel.getaLong());
			}
		}, 0, 1000);
		
		for (int i = 0; i < longGenerators.length; i++) {
			longGenerators[i].start();
		}
		
		for (int i = 0; i < intsGenerators.length; i++) {
			intsGenerators[i].start();
		}
		
	}

	private static void initArrays(Thread[] intsGenerators,
			Thread[] longGenerator, IModel theModel) {
		for (int i = 0; i < longGenerator.length; i++) {
			longGenerator[i] = new Thread(new LongGenerator(theModel));
		}
		
		for (int i = 0; i < intsGenerators.length; i++) {
			intsGenerators[i] = new Thread(new IntsGenerator(theModel));
		}
	}
	
	

}
